package base.thread_JUC2.chapter03.demo05;

import java.util.concurrent.Phaser;

/**
 * 当我们有并发任务并且需要分解成几步执行时可以使用Phaser。
 * phaser类机制是在每一步结束的位置对线程进行同步，当所有的线程都完成了这一步，才允许执行下一步。
 * 跟其他同步工具一样，必须对Phaser类中参与同步操作的任务数进行初始化，不同的是，我们可以动态地增加或者减少任务数。
 *
 * 该案例使用Phaser类同步三个并发任务，这三个任务将在三个不同的文件夹及其子文件夹中查找过去24小时内修改过扩展名为.log的文件，这个
 * 任务分成以下三个步骤：
 * 1、在指定的文件夹及其子文件夹中获得扩展名为.log的文件；
 * 2、对第一步的结果进行过滤，删除修改时间超过24小时的文件；
 * 3、将结果打印到控制台
 * 在第一步和第二步结束的时候，都会检查锁查找到的结果列表是不是有元素存在。如果结果列表是空的，对应的线程将结束执行，并且从Phaser中删除。
 */
public class TestCase {

    public static void main(String[] args) throws InterruptedException {

        // 创建Phaser对象，包含3个参与者(3并发任务)
        Phaser phaser = new Phaser(3);

        FileSearch system = new FileSearch("C:\\Windows", "log", phaser);
        FileSearch apps = new FileSearch("C:\\Program Files", "log", phaser);
        FileSearch documents = new FileSearch("C:\\Users\\sann\\Documents", "log", phaser);

        Thread systemThread = new Thread(system,"System");
        Thread appThread = new Thread(apps, "Apps");
        Thread documentsThread = new Thread(documents, "Documents");
        systemThread.start();
        appThread.start();
        Thread.sleep(5000);
        documentsThread.start();

        // 让main线程等待上述3线程执行结束
        try {
            systemThread.join();
            appThread.join();
            documentsThread.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }

        System.out.printf("phaser 已终止：%s \n", phaser.isTerminated());

    }
}
